home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / mdisk25.arj / EMIAPP.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-08-31  |  13.4 KB  |  619 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Turbo Pascal Version 6.0                        }
  5. {       Turbo Vision Unit                               }
  6. {                                                       }
  7. {       Copyright (c) 1990 Borland International        }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. { Módulo de programa modificado para su uso con Mdiskpro }
  12. { modificaciones (c) Emilio David Diaus López 1994       }
  13.  
  14. Unit Emiapp;
  15.  
  16. {$F+,O+,S-,X+,D-,L-,R-}
  17.  
  18. Interface
  19.  
  20. Uses Objects, Drivers, Memory, Histlist, Views, Menus;
  21.  
  22. Const
  23.  
  24. { TApplication palette entries }
  25.  
  26.   Apcolor      = 0;
  27.   Apblackwhite = 1;
  28.   Apmonochrome = 2;
  29.  
  30. { TApplication palettes }
  31.  
  32.   Ccolor =
  33.         #$71#$31#$3F#$3E#$1F#$1F#$1E#$17#$1F#$1F#$3B#$3B#$1E#$71#$00 +
  34.     #$7F#$3F#$3F#$13#$13#$3E#$21#$00#$70#$7F#$7F#$13#$13#$70#$7F#$00 +
  35.     #$70#$7F#$7A#$13#$13#$70#$70#$7F#$7E#$20#$2B#$2F#$78#$2E#$70#$30 +
  36.     #$3F#$3E#$1F#$2F#$1A#$20#$72#$79#$79#$38#$2F#$3E#$31#$13#$00#$00;
  37.  
  38.   Cblackwhite =
  39.         #$70#$70#$78#$7F#$07#$07#$0F#$07#$0F#$07#$70#$70#$07#$70#$00 +
  40.     #$07#$0F#$07#$70#$70#$07#$70#$00#$70#$7F#$7F#$70#$07#$70#$07#$00 +
  41.     #$70#$7F#$7F#$70#$07#$70#$70#$7F#$7F#$07#$0F#$0F#$78#$0F#$78#$07 +
  42.     #$0F#$0F#$0F#$70#$0F#$07#$70#$70#$70#$07#$70#$0F#$07#$07#$00#$00;
  43.  
  44.   Cmonochrome =
  45.         #$70#$07#$07#$0F#$70#$70#$70#$07#$0F#$07#$70#$70#$07#$70#$00 +
  46.     #$07#$0F#$07#$70#$70#$07#$70#$00#$70#$70#$70#$07#$07#$70#$07#$00 +
  47.     #$70#$70#$70#$07#$07#$70#$70#$70#$0F#$07#$07#$0F#$70#$0F#$70#$07 +
  48.     #$0F#$0F#$07#$70#$07#$07#$70#$07#$07#$07#$70#$0F#$07#$07#$00#$00;
  49.  
  50.  
  51. { TBackground palette }
  52.  
  53.   Cbackground = #8;
  54.  
  55. Type
  56.  
  57. { TBackground object }
  58.  
  59.   Pbackground = ^Tbackground;
  60.   Tbackground = Object(Tview)
  61.     Pattern: Char;
  62.     Constructor Init(Var Bounds: Trect; Apattern: Char);
  63.     Constructor Load(Var S: Tstream);
  64.     Procedure Draw; Virtual;
  65.     Function Getpalette: Ppalette; Virtual;
  66.     Procedure Store(Var S: Tstream);
  67.   End;
  68.  
  69. { TDeskTop object }
  70.  
  71.   Pdesktop = ^Tdesktop;
  72.   Tdesktop = Object(Tgroup)
  73.     Background: Pbackground;
  74.     Constructor Init(Var Bounds: Trect);
  75.     Procedure Cascade(Var R: Trect);
  76.     Procedure Handleevent(Var Event: Tevent); Virtual;
  77.     Procedure Initbackground; Virtual;
  78.     Procedure Tile(Var R: Trect);
  79.     Procedure Tileerror; Virtual;
  80.   End;
  81.  
  82. { TProgram object }
  83.  
  84.   { Palette layout }
  85.   {     1 = TBackground }
  86.   {  2- 7 = TMenuView and TStatusLine }
  87.   {  8-15 = TWindow(Blue) }
  88.   { 16-23 = TWindow(Cyan) }
  89.   { 24-31 = TWindow(Gray) }
  90.   { 32-63 = TDialog }
  91.  
  92.   Pprogram = ^Tprogram;
  93.   Tprogram = Object(Tgroup)
  94.     Constructor Init;
  95.     Destructor Done; Virtual;
  96.     Procedure Getevent(Var Event: Tevent); Virtual;
  97.     Function Getpalette: Ppalette; Virtual;
  98.     Procedure Handleevent(Var Event: Tevent); Virtual;
  99.     Procedure Idle; Virtual;
  100.     Procedure Initdesktop; Virtual;
  101.     Procedure Initmenubar; Virtual;
  102.     Procedure Initscreen; Virtual;
  103.     Procedure Initstatusline; Virtual;
  104.     Procedure Outofmemory; Virtual;
  105.     Procedure Putevent(Var Event: Tevent); Virtual;
  106.     Procedure Run; Virtual;
  107.     Procedure Setscreenmode(Mode: Word);
  108.     Function Validview(P: Pview): Pview;
  109.   End;
  110.  
  111. { TApplication object }
  112.  
  113.   Papplication = ^Tapplication;
  114.   Tapplication = Object(Tprogram)
  115.     Constructor Init;
  116.     Destructor Done; Virtual;
  117.   End;
  118.  
  119. { App registration procedure }
  120.  
  121. Procedure Registerapp;
  122.  
  123. Const
  124.  
  125. { Public variables }
  126.  
  127.   Application: Pprogram = Nil;
  128.   Desktop: Pdesktop = Nil;
  129.   Statusline: Pstatusline = Nil;
  130.   Menubar: Pmenuview = Nil;
  131.   Apppalette: Integer = Apcolor;
  132.  
  133. { Stream registration records }
  134.  
  135.   Rbackground: Tstreamrec = (
  136.     Objtype: 30;
  137.     Vmtlink: Ofs(Typeof(Tbackground)^);
  138.     Load: @Tbackground.Load;
  139.     Store: @Tbackground.Store);
  140.  
  141.   Rdesktop: Tstreamrec = (
  142.     Objtype: 31;
  143.     Vmtlink: Ofs(Typeof(Tdesktop)^);
  144.     Load: @Tdesktop.Load;
  145.     Store: @Tdesktop.Store);
  146.  
  147. Implementation
  148.  
  149. Const
  150.  
  151. { Private variables }
  152.  
  153.   Pending: Tevent = (What: Evnothing);
  154.  
  155. { TBackground }
  156.  
  157. Constructor Tbackground.Init(Var Bounds: Trect; Apattern: Char);
  158. Begin
  159.   Tview.Init(Bounds);
  160.   Growmode := Gfgrowhix + Gfgrowhiy;
  161.   Pattern := Apattern;
  162. End;
  163.  
  164. Constructor Tbackground.Load(Var S: Tstream);
  165. Begin
  166.   Tview.Load(S);
  167.   S.Read(Pattern, Sizeof(Pattern));
  168. End;
  169.  
  170. Procedure Tbackground.Draw;
  171. Var
  172.   S:String;
  173.   Bx,By:Byte;
  174. Begin
  175.      S:='MicroDisk ';
  176.      For By:=0 To Size.Y Do Begin
  177.          Bx:=0;
  178.          While Bx<=Size.X Do Begin
  179.                Writestr(Bx,By,S,1);
  180.                Inc(Bx,Length(S))
  181.          End;
  182.      End;
  183. End;
  184.  
  185. Function Tbackground.Getpalette: Ppalette;
  186. Const
  187.   P: String[Length(Cbackground)] = Cbackground;
  188. Begin
  189.   Getpalette := @P;
  190. End;
  191.  
  192. Procedure Tbackground.Store(Var S: Tstream);
  193. Begin
  194.   Tview.Store(S);
  195.   S.Write(Pattern, Sizeof(Pattern));
  196. End;
  197.  
  198. { TDeskTop object }
  199.  
  200. Constructor Tdesktop.Init(Var Bounds: Trect);
  201. Begin
  202.   Tgroup.Init(Bounds);
  203.   Growmode := Gfgrowhix + Gfgrowhiy;
  204.   Initbackground;
  205.   If Background <> Nil Then Insert(Background);
  206. End;
  207.  
  208. Function Tileable(P: Pview): Boolean;
  209. Begin
  210.   Tileable := (P^.Options And Oftileable <> 0) And
  211.     (P^.State And Sfvisible <> 0);
  212. End;
  213.  
  214. Procedure Tdesktop.Cascade(Var R: Trect);
  215. Var
  216.   Cascadenum: Integer;
  217.   Lastview: Pview;
  218.   Min, Max: Tpoint;
  219.  
  220.  
  221. Procedure Docount(P: Pview); Far;
  222. Begin
  223.   If Tileable(P) Then
  224.   Begin
  225.     Inc(Cascadenum);
  226.     Lastview := P;
  227.   End;
  228. End;
  229.  
  230. Procedure Docascade(P: Pview); Far;
  231. Var
  232.   Nr: Trect;
  233. Begin
  234.   If Tileable(P) And (Cascadenum >= 0) Then
  235.   Begin
  236.     Nr.Copy(R);
  237.     Inc(Nr.A.X, Cascadenum); Inc(Nr.A.Y, Cascadenum);
  238.     P^.Locate(Nr);
  239.     Dec(Cascadenum);
  240.   End;
  241. End;
  242.  
  243. Begin
  244.   Cascadenum := 0;
  245.   Foreach(@Docount);
  246.   If Cascadenum > 0 Then
  247.   Begin
  248.     Lastview^.Sizelimits(Min, Max);
  249.     If (Min.X > R.B.X - R.A.X - Cascadenum) Or
  250.        (Min.Y > R.B.Y - R.A.Y - Cascadenum) Then Tileerror
  251.     Else
  252.     Begin
  253.       Dec(Cascadenum);
  254.       Lock;
  255.       Foreach(@Docascade);
  256.       Unlock;
  257.     End;
  258.   End;
  259. End;
  260.  
  261. Procedure Tdesktop.Handleevent(Var Event: Tevent);
  262. Begin
  263.   Tgroup.Handleevent(Event);
  264.   If Event.What = Evcommand Then
  265.   Begin
  266.     Case Event.Command Of
  267.       Cmnext: Selectnext(False);
  268.       Cmprev: Current^.Putinfrontof(Background);
  269.     Else
  270.       Exit;
  271.     End;
  272.     Clearevent(Event);
  273.   End;
  274. End;
  275.  
  276. Procedure Tdesktop.Initbackground;
  277. Var
  278.   R: Trect;
  279. Begin
  280.   Getextent(R);
  281.   New(Background, Init(R, #32));
  282. End;
  283.  
  284. Function Isqr(X: Integer): Integer; Assembler;
  285. Asm
  286.     Mov    Cx,x
  287.         Mov    Bx,0
  288. @@1:    Inc     Bx
  289.     Mov    Ax,Bx
  290.     Imul    Ax
  291.         Cmp    Ax,Cx
  292.         Jle    @@1
  293.     Mov    Ax,Bx
  294.         Dec     Ax
  295. End;
  296.  
  297. Procedure Mostequaldivisors(N: Integer; Var X, Y: Integer);
  298. Var
  299.   I: Integer;
  300. Begin
  301.   I := Isqr(N);
  302.   If ((N Mod I) <> 0) Then
  303.     If (N Mod (I+1)) = 0 Then Inc(I);
  304.   If I < (N Div I) Then I := N Div I;
  305.   X := N Div I;
  306.   Y := I;
  307. End;
  308.  
  309. Procedure Tdesktop.Tile(Var R: Trect);
  310. Var
  311.   Numcols, Numrows, Numtileable, Leftover, Tilenum: Integer;
  312.  
  313. Procedure Docounttileable(P: Pview); Far;
  314. Begin
  315.   If Tileable(P) Then Inc(Numtileable);
  316. End;
  317.  
  318. Function Dividerloc(Lo, Hi, Num, Pos: Integer): Integer;
  319. Begin
  320.   Dividerloc := Longdiv(Longmul(Hi - Lo, Pos), Num) + Lo;
  321. End;
  322.  
  323. Procedure Calctilerect(Pos: Integer; Var Nr: Trect);
  324. Var
  325.   X,Y,D: Integer;
  326. Begin
  327.   D := (Numcols - Leftover) * Numrows;
  328.   If Pos < D Then
  329.   Begin
  330.     X := Pos Div Numrows;
  331.     Y := Pos Mod Numrows;
  332.   End Else
  333.   Begin
  334.     X := (Pos - D) Div (Numrows + 1) + (Numcols - Leftover);
  335.     Y := (Pos - D) Mod (Numrows + 1);
  336.   End;
  337.   Nr.A.X := Dividerloc(R.A.X, R.B.X, Numcols, X);
  338.   Nr.B.X := Dividerloc(R.A.X, R.B.X, Numcols, X+1);
  339.   If Pos >= D Then
  340.   Begin
  341.     Nr.A.Y := Dividerloc(R.A.Y, R.B.Y, Numrows+1, Y);
  342.     Nr.B.Y := Dividerloc(R.A.Y, R.B.Y, Numrows+1, Y+1);
  343.   End Else
  344.   Begin
  345.     Nr.A.Y := Dividerloc(R.A.Y, R.B.Y, Numrows, Y);
  346.     Nr.B.Y := Dividerloc(R.A.Y, R.B.Y, Numrows, Y+1);
  347.   End;
  348. End;
  349.  
  350. Procedure Dotile(P: Pview); Far;
  351. Var
  352.   R: Trect;
  353. Begin
  354.   If Tileable(P) Then
  355.   Begin
  356.     Calctilerect(Tilenum, R);
  357.     P^.Locate(R);
  358.     Dec(Tilenum);
  359.   End;
  360. End;
  361.  
  362. Begin
  363.   Numtileable := 0;
  364.   Foreach(@Docounttileable);
  365.   If Numtileable > 0 Then
  366.   Begin
  367.     Mostequaldivisors(Numtileable, Numcols, Numrows);
  368.     If ((R.B.X - R.A.X) Div Numcols = 0) Or
  369.        ((R.B.Y - R.A.Y) Div Numrows = 0) Then Tileerror
  370.     Else
  371.     Begin
  372.       Leftover := Numtileable Mod Numcols;
  373.       Tilenum := Numtileable-1;
  374.       Lock;
  375.       Foreach(@Dotile);
  376.       Unlock;
  377.     End;
  378.   End;
  379. End;
  380.  
  381. Procedure Tdesktop.Tileerror;
  382. Begin
  383. End;
  384.  
  385. { TProgram }
  386.  
  387. Constructor Tprogram.Init;
  388. Var
  389.   R: Trect;
  390. Begin
  391.   Application := @Self;
  392.   Initscreen;
  393.   R.Assign(0, 0, Screenwidth, Screenheight);
  394.   Tgroup.Init(R);
  395.   State := Sfvisible + Sfselected + Sffocused + Sfmodal + Sfexposed;
  396.   Options := 0;
  397.   Buffer := Screenbuffer;
  398.   Initdesktop;
  399.   Initstatusline;
  400.   Initmenubar;
  401.   If Desktop <> Nil Then Insert(Desktop);
  402.   If Statusline <> Nil Then Insert(Statusline);
  403.   If Menubar <> Nil Then Insert(Menubar);
  404. End;
  405.  
  406. Destructor Tprogram.Done;
  407. Begin
  408.   If Desktop <> Nil Then Dispose(Desktop, Done);
  409.   If Menubar <> Nil Then Dispose(Menubar, Done);
  410.   If Statusline <> Nil Then Dispose(Statusline, Done);
  411.   Application := Nil;
  412. End;
  413.  
  414. Procedure Tprogram.Getevent(Var Event: Tevent);
  415. Var
  416.   R: Trect;
  417.  
  418. Function Containsmouse(P: Pview): Boolean; Far;
  419. Begin
  420.   Containsmouse := (P^.State And Sfvisible <> 0) And
  421.     P^.Mouseinview(Event.Where);
  422. End;
  423.  
  424. Begin
  425.   If Pending.What <> Evnothing Then
  426.   Begin
  427.     Event := Pending;
  428.     Pending.What := Evnothing;
  429.   End Else
  430.   Begin
  431.     Getmouseevent(Event);
  432.     If Event.What = Evnothing Then
  433.     Begin
  434.       Getkeyevent(Event);
  435.       If Event.What = Evnothing Then Idle;
  436.     End;
  437.   End;
  438.   If Statusline <> Nil Then
  439.     If (Event.What And Evkeydown <> 0) Or
  440.       (Event.What And Evmousedown <> 0) And
  441.       (Firstthat(@Containsmouse) = Pview(Statusline)) Then
  442.       Statusline^.Handleevent(Event);
  443. End;
  444.  
  445. Function Tprogram.Getpalette: Ppalette;
  446. Const
  447.   P: Array[Apcolor..Apmonochrome] Of String[Length(Ccolor)] =
  448.     (Ccolor, Cblackwhite, Cmonochrome);
  449. Begin
  450.   Getpalette := @P[Apppalette];
  451. End;
  452.  
  453. Procedure Tprogram.Handleevent(Var Event: Tevent);
  454. Var
  455.   I: Word;
  456.   C: Char;
  457. Begin
  458.   If Event.What = Evkeydown Then
  459.   Begin
  460.     C := Getaltchar(Event.Keycode);
  461.     If (C >= '1') And (C <= '9') Then
  462.       If Message(Desktop, Evbroadcast, Cmselectwindownum,
  463.         Pointer(Byte(C) - $30)) <> Nil Then Clearevent(Event);
  464.   End;
  465.   Tgroup.Handleevent(Event);
  466.   If Event.What = Evcommand Then
  467.     If Event.Command = Cmquit Then
  468.     Begin
  469.       Endmodal(Cmquit);
  470.       Clearevent(Event);
  471.     End;
  472. End;
  473.  
  474. Procedure Tprogram.Idle;
  475. Begin
  476.   If Statusline <> Nil Then Statusline^.Update;
  477.   If Commandsetchanged Then
  478.   Begin
  479.     Message(@Self, Evbroadcast, Cmcommandsetchanged, Nil);
  480.     Commandsetchanged := False;
  481.   End;
  482. End;
  483.  
  484. Procedure Tprogram.Initdesktop;
  485. Var
  486.   R: Trect;
  487. Begin
  488.   Getextent(R);
  489.   Inc(R.A.Y);
  490.   Dec(R.B.Y);
  491.   New(Desktop, Init(R));
  492. End;
  493.  
  494. Procedure Tprogram.Initmenubar;
  495. Var
  496.   R: Trect;
  497. Begin
  498.   Getextent(R);
  499.   R.B.Y := R.A.Y + 1;
  500.   Menubar := New(Pmenubar, Init(R, Nil));
  501. End;
  502.  
  503. Procedure Tprogram.Initscreen;
  504. Begin
  505.   If Lo(Screenmode) <> Smmono Then
  506.   Begin
  507.     If Screenmode And Smfont8X8 <> 0 Then
  508.       Shadowsize.X := 1 Else
  509.       Shadowsize.X := 2;
  510.     Shadowsize.Y := 1;
  511.     Showmarkers := False;
  512.     If Lo(Screenmode) = Smbw80 Then
  513.       Apppalette := Apblackwhite Else
  514.       Apppalette := Apcolor;
  515.   End Else
  516.   Begin
  517.     Shadowsize.X := 0;
  518.     Shadowsize.Y := 0;
  519.     Showmarkers := True;
  520.     Apppalette := Apmonochrome;
  521.   End;
  522. End;
  523.  
  524. Procedure Tprogram.Initstatusline;
  525. Var
  526.   R: Trect;
  527. Begin
  528.   Getextent(R);
  529.   R.A.Y := R.B.Y - 1;
  530.   New(Statusline, Init(R,
  531.     Newstatusdef(0, $Ffff,
  532.       Newstatuskey('~Alt-X~ Exit', Kbaltx, Cmquit,
  533.       Newstatuskey('', Kbf10, Cmmenu,
  534.       Newstatuskey('', Kbaltf3, Cmclose,
  535.       Newstatuskey('', Kbf5, Cmzoom,
  536.       Newstatuskey('', Kbctrlf5, Cmresize,
  537.       Newstatuskey('', Kbf6, Cmnext, Nil)))))), Nil)));
  538. End;
  539.  
  540. Procedure Tprogram.Outofmemory;
  541. Begin
  542. End;
  543.  
  544. Procedure Tprogram.Putevent(Var Event: Tevent);
  545. Begin
  546.   Pending := Event;
  547. End;
  548.  
  549. Procedure Tprogram.Run;
  550. Begin
  551.   Execute;
  552. End;
  553.  
  554. Procedure Tprogram.Setscreenmode(Mode: Word);
  555. Var
  556.   R: Trect;
  557. Begin
  558.   Hidemouse;
  559.   Setvideomode(Mode);
  560.   Donememory;
  561.   Initscreen;
  562.   Buffer := Screenbuffer;
  563.   R.Assign(0, 0, Screenwidth, Screenheight);
  564.   Changebounds(R);
  565.   Showmouse;
  566. End;
  567.  
  568. Function Tprogram.Validview(P: Pview): Pview;
  569. Begin
  570.   Validview := Nil;
  571.   If P <> Nil Then
  572.   Begin
  573.     If Lowmemory Then
  574.     Begin
  575.       Dispose(P, Done);
  576.       Outofmemory;
  577.       Exit;
  578.     End;
  579.     If Not P^.Valid(Cmvalid) Then
  580.     Begin
  581.       Dispose(P, Done);
  582.       Exit;
  583.     End;
  584.     Validview := P;
  585.   End;
  586. End;
  587.  
  588. { TApplication }
  589.  
  590. Constructor Tapplication.Init;
  591. Begin
  592.   Initmemory;
  593.   Initvideo;
  594.   Initevents;
  595.   Initsyserror;
  596.   Inithistory;
  597.   Tprogram.Init;
  598. End;
  599.  
  600. Destructor Tapplication.Done;
  601. Begin
  602.   Tprogram.Done;
  603.   Donehistory;
  604.   Donesyserror;
  605.   Doneevents;
  606.   Donevideo;
  607.   Donememory;
  608. End;
  609.  
  610. { App registration procedure }
  611.  
  612. Procedure Registerapp;
  613. Begin
  614.   Registertype(Rbackground);
  615.   Registertype(Rdesktop);
  616. End;
  617.  
  618. End.
  619.